// src/utils/http.js
import axios from 'axios';
// 增加api版本前缀
const apiPrefix = '/api/v1';
// const baseURL = 'http://localhost:8888';
const baseURL = 'http://192.168.10.11:8888';
// const baseURL = '';

// 创建 Axios 实例
const http = axios.create({
  baseURL: baseURL + apiPrefix, // JSONPlaceholder 的基础 URL
  timeout: 5000, // 超时时间
});


// 请求拦截器
http.interceptors.request.use(
  (config) => {
    // 判断请求方法是否是 POST，并且需要发送 JSON 数据
    if (config.method === 'post') {
      // 自动设置 Content-Type 为 application/json
      config.headers['Content-Type'] = 'application/json';
    }

    // 可根据需要修改请求配置
    const token = localStorage.getItem('accessToken');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  (error) => Promise.reject(error)
);

// 响应拦截器
http.interceptors.response.use(
  (response) => {
    // console.log(response.data)
    // 可根据需要修改请求配置
    return response.data
  }, // 简化返回结果，直接返回数据部分
  async (error) => {
    const originalRequest = error.config;
    if (error.response && error.response.status === 401) {
      // 自动刷新token
      let token = localStorage.getItem("refreshToken")
      if (!token) {
        return Promise.reject(error);
      }
      let header = {
        headers: {
          'Content-Type': 'application/json',  // 请求内容为 JSON 格式
          'Authorization': `Bearer ${token}`   // 设置 Authorization 头
        }
      }
      try {
        let res = await axios.post(baseURL + apiPrefix + "/refresh", {}, header)
        if (res.data.code === "ok") {
          localStorage.setItem("accessToken", res.data.data.access_token)
          localStorage.setItem("refreshToken", res.data.data.refresh_token)
          console.log("令牌刷新成功")
          http.defaults.headers['Authorization'] = `Bearer ${res.data.data.access_token}`;
          originalRequest.headers['Authorization'] = `Bearer ${res.data.data.access_token}`;
          // 重新发起http请求
          return http(originalRequest);
        } else {
          return Promise.reject(error);
        }

      } catch (error) {
        return Promise.reject(error);
      }

    } else {
      return Promise.reject(error);
    }
  }
);

/**
 * 封装的通用请求函数
 * @param {String} url 请求地址（相对于 baseURL）
 * @param {Object} params 请求参数对象
 * @param {String} method 请求方法 (GET, POST, PUT, DELETE)
 * @returns {Promise}
 */
function request({ url, params = {}, method = 'GET' }) {
  const config = {
    url,
    method: method.toUpperCase(),
  };

  if (method.toUpperCase() === 'GET') {
    config.params = params; // GET 请求的参数
  } else {
    config.data = params; // 非 GET 请求的参数
    // config.headers = {
    //   'Content-Type': 'application/json',
    // }
  }

  return http(config);
}


export default request;
